home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1997 December / PC Pro December 1997 CD-Rom coverdisc.iso / symantec / dbAnywh / JAVA.BIN / CLASSES.ZIP / sun / tools / tree / FieldExpression.class (.txt) < prev    next >
Encoding:
Java Class File  |  1996-12-14  |  8.2 KB  |  316 lines

  1. package sun.tools.tree;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Hashtable;
  5. import sun.tools.asm.Assembler;
  6. import sun.tools.java.AmbiguousField;
  7. import sun.tools.java.ClassDefinition;
  8. import sun.tools.java.ClassNotFound;
  9. import sun.tools.java.CompilerError;
  10. import sun.tools.java.Constants;
  11. import sun.tools.java.Environment;
  12. import sun.tools.java.FieldDefinition;
  13. import sun.tools.java.Identifier;
  14. import sun.tools.java.Type;
  15.  
  16. public class FieldExpression extends UnaryExpression {
  17.    // $FF: renamed from: id sun.tools.java.Identifier
  18.    Identifier field_0;
  19.    FieldDefinition field;
  20.    boolean parsed = false;
  21.  
  22.    public FieldExpression(int var1, Expression var2, Identifier var3) {
  23.       super(46, var1, Type.tError, var2);
  24.       this.field_0 = var3;
  25.    }
  26.  
  27.    public FieldExpression(int var1, Context var2, FieldDefinition var3) {
  28.       super(46, var1, var3.getType(), var3.isStatic() ? null : new ThisExpression(var1, var2));
  29.       this.field_0 = var3.getName();
  30.       this.field = var3;
  31.    }
  32.  
  33.    Identifier toIdentifier() {
  34.       StringBuffer var1 = new StringBuffer();
  35.       FieldExpression var2 = this;
  36.       var1.append('.');
  37.       var1.append(this.field_0);
  38.  
  39.       while(var2.right.op == 46) {
  40.          var2 = (FieldExpression)var2.right;
  41.          var1.insert(0, var2.field_0);
  42.          var1.insert(0, '.');
  43.       }
  44.  
  45.       if (var2.right.op != 60) {
  46.          return null;
  47.       } else {
  48.          var1.insert(0, ((IdentifierExpression)var2.right).id);
  49.          return Identifier.lookup(var1.toString());
  50.       }
  51.    }
  52.  
  53.    Type toType(Environment var1, Context var2) {
  54.       Identifier var3 = this.toIdentifier();
  55.       if (var3 == null) {
  56.          var1.error(super.where, "invalid.type.expr");
  57.          return Type.tError;
  58.       } else {
  59.          return Type.tClass(var3);
  60.       }
  61.    }
  62.  
  63.    static Expression mungeFieldRight(Expression var0, Environment var1, Context var2, IdentifierExpression[] var3) throws ClassNotFound, AmbiguousField {
  64.       switch (var0.op) {
  65.          case 46:
  66.             FieldExpression var8 = (FieldExpression)var0;
  67.             Expression var9 = mungeFieldRight(var8.right, var1, var2, var3);
  68.             if (var9 != null) {
  69.                var8.right = var9;
  70.                return var0;
  71.             } else {
  72.                Identifier var10 = var8.toIdentifier();
  73.                if (var10 != null && var1.classExists(var10)) {
  74.                   Type var7 = var0.toType(var1, var2);
  75.                   return new TypeExpression(var0.where, var7);
  76.                }
  77.  
  78.                return null;
  79.             }
  80.          case 60:
  81.             Identifier var4 = ((IdentifierExpression)var0).id;
  82.             if (var2.getField(var1, var4) != null) {
  83.                return var0;
  84.             } else {
  85.                Type var5 = var0.toType(var1, var2);
  86.                Identifier var6 = var5.getClassName();
  87.                if (var1.classExists(var6)) {
  88.                   return new TypeExpression(var0.where, var5);
  89.                }
  90.  
  91.                var3[0] = (IdentifierExpression)var0;
  92.                return null;
  93.             }
  94.          default:
  95.             return var0;
  96.       }
  97.    }
  98.  
  99.    public long checkValue(Environment var1, Context var2, long var3, Hashtable var5) {
  100.       try {
  101.          boolean var6 = false;
  102.          IdentifierExpression[] var7 = new IdentifierExpression[1];
  103.          Expression var8 = mungeFieldRight(super.right, var1, var2, var7);
  104.          if (var8 == null) {
  105.             var1.error(var7[0].where, "undef.var", var7[0].id);
  106.             return var3;
  107.          }
  108.  
  109.          super.right = var8;
  110.          if (var8 instanceof TypeExpression) {
  111.             var6 = true;
  112.          } else {
  113.             var3 = super.right.checkValue(var1, var2, var3, var5);
  114.          }
  115.  
  116.          if (!super.right.type.isType(10)) {
  117.             if (super.right.type.isType(9) && this.field_0.equals(Constants.idLength)) {
  118.                super.type = Type.tInt;
  119.                return var3;
  120.             }
  121.  
  122.             if (!super.right.type.isType(13)) {
  123.                var1.error(super.where, "invalid.field.reference", this.field_0, super.right.type);
  124.             }
  125.  
  126.             return var3;
  127.          }
  128.  
  129.          ClassDefinition var9 = var1.getClassDefinition(super.right.type);
  130.          this.field = var9.getVariable(var1, this.field_0);
  131.          if (this.field == null) {
  132.             if ((this.field = var9.findAnyMethod(var1, this.field_0)) != null) {
  133.                var1.error(super.where, "invalid.field", this.field_0, this.field.getClassDeclaration());
  134.             } else {
  135.                var1.error(super.where, "no.such.field", this.field_0, var9);
  136.             }
  137.  
  138.             return var3;
  139.          }
  140.  
  141.          ClassDefinition var10 = var2.field.getClassDefinition();
  142.          super.type = this.field.getType();
  143.          if (!var10.canAccess(var1, this.field)) {
  144.             var1.error(super.where, "no.field.access", this.field_0, var9, var2.field.getClassDeclaration());
  145.             return var3;
  146.          }
  147.  
  148.          if (var6 && !this.field.isStatic()) {
  149.             ClassDefinition var11 = this.field.getClassDefinition();
  150.             if (!var11.implementedBy(var1, var2.field.getClassDeclaration()) || var2.field.isStatic()) {
  151.                var1.error(super.where, "no.static.field.access", this.field_0, var9);
  152.                return var3;
  153.             }
  154.  
  155.             super.right = new ThisExpression(super.right.where);
  156.             var3 = super.right.checkValue(var1, var2, var3, var5);
  157.             var6 = false;
  158.          }
  159.  
  160.          if (this.field.isProtected() && !(super.right instanceof SuperExpression) && !var10.protectedAccess(var1, this.field, super.right.type)) {
  161.             var1.error(super.where, "invalid.protected.field.use", this.field.getName(), this.field.getClassDeclaration(), super.right.type);
  162.             return var3;
  163.          }
  164.  
  165.          if (!this.field.isStatic() && super.right.op == 82 && (var3 & 1L) == 0L) {
  166.             var1.error(super.where, "access.inst.before.super", this.field_0);
  167.          }
  168.  
  169.          var2.field.getClassDefinition().addDependency(this.field.getClassDeclaration());
  170.       } catch (ClassNotFound var12) {
  171.          var1.error(super.where, "class.not.found", var12.name, var2.field);
  172.       } catch (AmbiguousField var13) {
  173.          var1.error(super.where, "ambig.field", this.field_0, var13.field1.getClassDeclaration(), var13.field2.getClassDeclaration());
  174.       }
  175.  
  176.       return var3;
  177.    }
  178.  
  179.    public long checkLHS(Environment var1, Context var2, long var3, Hashtable var5) {
  180.       this.checkValue(var1, var2, var3, var5);
  181.       if (this.field == null) {
  182.          if (super.right.type.isType(9) && this.field_0.equals(Constants.idLength)) {
  183.             var1.error(super.where, "invalid.lhs.assignment");
  184.          }
  185.       } else if (this.field.isFinal()) {
  186.          var1.error(super.where, "assign.to.final", this.field_0);
  187.       }
  188.  
  189.       return var3;
  190.    }
  191.  
  192.    public long checkAssignOp(Environment var1, Context var2, long var3, Hashtable var5, Expression var6) {
  193.       this.checkValue(var1, var2, var3, var5);
  194.       if (this.field == null) {
  195.          if (super.right.type.isType(9) && this.field_0.equals(Constants.idLength)) {
  196.             super.checkAssignOp(var1, var2, var3, var5, var6);
  197.          }
  198.       } else if (this.field.isFinal()) {
  199.          var1.error(super.where, "assign.to.final", this.field_0);
  200.       }
  201.  
  202.       return var3;
  203.    }
  204.  
  205.    public Expression inline(Environment var1, Context var2) {
  206.       return super.right != null ? super.right.inline(var1, var2) : null;
  207.    }
  208.  
  209.    public Expression inlineValue(Environment var1, Context var2) {
  210.       try {
  211.          if (this.field == null) {
  212.             return (Expression)(this.field_0.equals(Constants.idLength) ? (new LengthExpression(super.where, super.right)).inlineValue(var1, var2) : this);
  213.          } else {
  214.             if (super.right != null && super.right.op == 147) {
  215.                super.right = null;
  216.             }
  217.  
  218.             if (this.field.isFinal()) {
  219.                Expression var3 = (Expression)this.field.getValue(var1);
  220.                if (var3 != null && var3.isConstant()) {
  221.                   return (new CommaExpression(super.where, super.right, var3)).inlineValue(var1, var2);
  222.                }
  223.             }
  224.  
  225.             if (super.right != null) {
  226.                if (this.field.isStatic()) {
  227.                   Expression var5 = super.right.inline(var1, var2);
  228.                   super.right = null;
  229.                   if (var5 != null) {
  230.                      return new CommaExpression(super.where, var5, this);
  231.                   }
  232.                } else {
  233.                   super.right = super.right.inlineValue(var1, var2);
  234.                }
  235.             }
  236.  
  237.             return this;
  238.          }
  239.       } catch (ClassNotFound var4) {
  240.          throw new CompilerError(var4);
  241.       }
  242.    }
  243.  
  244.    public Expression inlineLHS(Environment var1, Context var2) {
  245.       if (super.right != null && super.right.op == 147) {
  246.          super.right = null;
  247.       }
  248.  
  249.       if (super.right != null) {
  250.          if (this.field.isStatic()) {
  251.             Expression var3 = super.right.inline(var1, var2);
  252.             super.right = null;
  253.             if (var3 != null) {
  254.                return new CommaExpression(super.where, var3, this);
  255.             }
  256.          } else {
  257.             super.right = super.right.inlineValue(var1, var2);
  258.          }
  259.       }
  260.  
  261.       return this;
  262.    }
  263.  
  264.    public int costInline(int var1) {
  265.       return 3 + (super.right != null ? super.right.costInline(var1) : 0);
  266.    }
  267.  
  268.    int codeLValue(Environment var1, Context var2, Assembler var3) {
  269.       if (this.field.isStatic()) {
  270.          if (super.right != null) {
  271.             super.right.code(var1, var2, var3);
  272.             return 1;
  273.          } else {
  274.             return 0;
  275.          }
  276.       } else {
  277.          super.right.codeValue(var1, var2, var3);
  278.          return 1;
  279.       }
  280.    }
  281.  
  282.    void codeLoad(Environment var1, Context var2, Assembler var3) {
  283.       if (this.field == null) {
  284.          throw new CompilerError("should not be null");
  285.       } else if (this.field.isStatic()) {
  286.          var3.add(super.where, 178, this.field);
  287.       } else {
  288.          var3.add(super.where, 180, this.field);
  289.       }
  290.    }
  291.  
  292.    void codeStore(Environment var1, Context var2, Assembler var3) {
  293.       if (this.field.isStatic()) {
  294.          var3.add(super.where, 179, this.field);
  295.       } else {
  296.          var3.add(super.where, 181, this.field);
  297.       }
  298.    }
  299.  
  300.    public void codeValue(Environment var1, Context var2, Assembler var3) {
  301.       this.codeLValue(var1, var2, var3);
  302.       this.codeLoad(var1, var2, var3);
  303.    }
  304.  
  305.    public void print(PrintStream var1) {
  306.       var1.print("(");
  307.       if (super.right != null) {
  308.          super.right.print(var1);
  309.       } else {
  310.          var1.print("<empty>");
  311.       }
  312.  
  313.       var1.print("." + this.field_0 + ")");
  314.    }
  315. }
  316.